///@file Material.h
///@brief Declaration of the class representing a material
///@author Arnaud Duval
///@version 0.0
///@date 2010/02/26


#ifndef MATERIAL_H
#define MATERIAL_H

#include "Tensor2.h"
#include "StressTensor.h"
#include "StrainTensor.h"

///@class Material
///@brief Class defining a material
class Material
{
    private:

    protected:
        ///@brief reference of element
        std::string reference;

    public:
        ///@brief Default constructor
        Material();
        ///@brief Destructor
        virtual ~Material();
        ///@brief Set the value of a given parameter
        virtual void SetParameter(int, double);
        ///@brief Compute stess tensor increment from strain tensor tensor increment and initial stress and strain
        virtual StressTensor Dstress(StrainTensor, StressTensor, StrainTensor);
        ///@brief Print output
        virtual void PrintOutput(std::ostream &);
        ///@brief Set reference value
        void SetReference(std::string);
        ///@brief Return value of reference
        std::string Reference();
        ///@brief Similar to an Abaqus UMAT
        virtual bool UMAT(const Vector&, const Vector&, Vector&, Matrix&);
        ///@brief Overload of << operator
        friend std::ostream& operator << (std::ostream&, Material&);
};





#endif
